package com.fyb.basic.lock.thread;


import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 两个线程交替打印数字和字母。一个线程打印数字1到52，另一个线程打印字母A到Z，
 * 打印顺序是两个数字后接一个字母
 */
public class CrossPrintWithLock {
    // 定义锁对象
    private static final Lock lock = new ReentrantLock();
    // 定义条件对象，用于数字打印的条件
    private static final Condition printNumberCondition = lock.newCondition();
    // 定义条件对象，用于字母打印的条件
    private static final Condition printLetterCondition = lock.newCondition();
    // 标志当前是否应该打印数字
    private static boolean printNumber = true;

    public static void main(String[] args) {
        // 定义打印数字的线程
        Thread printNumberThread = new Thread(() -> {
            for (int i = 1; i <= 52; i = i + 2) {
                synchronized (lock) {
                    while (!printNumber) { // 如果不是打印数字的轮次，则等待
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    // 打印两个连续的数字
                    System.out.print(i);
                    System.out.print(i + 1);
                    printNumber = false; // 设置标志为不打印数字
                    lock.notifyAll(); // 唤醒其他线程
                }
            }
        });

        // 定义打印字母的线程
        Thread printLetterThread = new Thread(() -> {
            for (char c = 'A'; c <= 'Z'; c++) {
                synchronized (lock) {
                    while (printNumber) { // 如果不是打印字母的轮次，则等待
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    // 打印一个字母
                    System.out.print(c);
                    printNumber = true; // 设置标志为打印数字
                    lock.notifyAll(); // 唤醒其他线程
                }
            }
        });

        // 启动打印字母的线程
        printLetterThread.start();
        // 启动打印数字的线程
        printNumberThread.start();
    }
}

